(function(){

    class Animal{
        name: string; 
        age: number;
        constructor(name: string, age: number) {
            this. name = name;
            this.age = age;
        }
        
        sayHello() {
            console.log('动物在叫')
        }
    }

    /**
     * Dog extends Animal
     * 使用继承后, 子类会拥有父类所有的方法和属性
     *  - 子类会覆盖和父类中相同的方法
     *      这种子类覆盖到父类方法的形式,我们称之为重写
     */
    // 定义一个表示狗的类
    class Dog extends Animal{
        run() {
            console.log(`${this.name}在跑`)
        }
        sayHello(){
            console.log('www')
        }
    }


    class Cat extends Animal{
        
        sayHello(){
            console.log('mmm')
        }
    }

    const dog = new Dog('汪汪', 1)
    const cat = new Cat('喵喵', 2)
    dog.run();
    dog.sayHello();
    cat.sayHello();
})();